const DB = require('better-sqlite3')

/**
 * Sqlite3 数据库初始化操作
 * @param {string} dbPath - 数据库文件路径
 * @returns {DB} - 返回一个数据库连接对象
 */
function initSqlite3DB(dbPath) {
    const db = new DB(dbPath, {
        fileMustExist: false,
        timeout: 5000
    })

    // 判断是否存在 projectinfo 表
    const tableExists = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='projectinfo'`).get()
    if (!tableExists) {
        console.log('projectinfo 表不存在，创建中...')
        /**
         * 初始化数据库
         * projectinfo:
         *       classid text
         *       stuid int
         *       name text
         *       projectname text
         *       projectid text
         *       path text
         *       skilltype text
         */
        db.prepare(`CREATE TABLE IF NOT EXISTS projectinfo (
        classid text,
        stuid INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        projectname TEXT,
        projectid TEXT,
        path TEXT,
        skilltype TEXT)`).run()
    }
    return db
}

/**
 * 插入数据
 * @param {DB} db - 数据库连接对象
 * @param {Object} data - 插入的数据
 * @returns {number} - 插入的行数
 */
function insertData(db, data) {
    const { classid, name, projectname, projectid, path, skilltype } = data
    const stmt = db.prepare(`INSERT INTO projectinfo (classid, name, projectname, projectid, path, skilltype) VALUES (?,?,?,?,?,?)`)
    return stmt.run(classid, name, projectname, projectid, path, skilltype).changes
}

/**
 * 根据classid查询数据
 * @param { DB } db - 数据库连接对象
 * @param { classid } classid - 查询条件
 * @returns { Array } - 查询结果
 */
function queryProject(db, classid) {
    const stmt = db.prepare(`SELECT * FROM projectinfo WHERE classid =?`)
    return stmt.all(classid)
}

/**
 * 根据 classid 和 name 查询数据
 * @param {DB} db - 数据库连接对象
 * @param {Object} data - 查询条件
 * @returns { Array } - 查询结果
 */
function querybyname(db, data) {
    const { classid, name } = data
    const stmt = db.prepare(`SELECT * FROM projectinfo WHERE classid =? AND name = ?`)
    return stmt.all(classid, name)
}

/**
 * 根据 classid 和 name 更新 projectname, path 和 skilltype
 * @param {DB} db - 数据库连接对象
 * @param {Object} data - 更新的数据
 * @returns {number} - 更新的行数  
 */
function updatepath(db, data) {
    const { classid, name, projectname, path, skilltype } = data
    const stmt = db.prepare(`UPDATE projectinfo SET projectname =?, path =?, skilltype =? WHERE classid =? AND name = ?`)
    // const stmt = db.prepare(`UPDATE projectinfo SET path =? WHERE classid =? AND name =?`)
    return stmt.run(projectname, path, skilltype, classid, name).changes
}




// 导出函数
module.exports = {
    initSqlite3DB,
    insertData,
    queryProject,
    updatepath,
    querybyname
}